home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / bipl.zip / PROCS.ZIP / GDL.ICN < prev    next >
Text File  |  1993-01-27  |  4KB  |  135 lines

  1. ############################################################################
  2. #
  3. #    File:     gdl.icn
  4. #
  5. #    Subject:  Procedures to get directory list 
  6. #
  7. #    Author:   Richard L. Goerwitz
  8. #
  9. #    Date:     June 1, 1991
  10. #
  11. ###########################################################################
  12. #
  13. #    Version:  1.2
  14. #
  15. ###########################################################################
  16. #
  17. #  gdl returns a list containing everything in a directory (whose name
  18. #  must be passed as an argument to gdl).  Nothing fancy.  I use this file
  19. #  as a template, modifying the procedures according to the needs of the
  20. #  program in which they are used.
  21. #
  22. ############################################################################
  23. #
  24. #  Requires:  UNIX or MS-DOS
  25. #
  26. ############################################################################
  27.  
  28. procedure gdl(dir)
  29.  
  30.     getdir := set_getdir_by_os()
  31.     return getdir(dir)
  32.  
  33. end
  34.  
  35.  
  36. procedure set_getdir_by_os()
  37.  
  38.     # Decide how to get a directory, based on whether we are running
  39.     # under UNIX or MS-DOS.
  40.  
  41.     if find("UNIX", &features)
  42.     then return unix_get_dir
  43.     else if find("MS-DOS", &features)
  44.     then return msdos_get_dir
  45.     else stop("Your operating system is not (yet) supported.")
  46.  
  47. end
  48.  
  49.  
  50.  
  51. procedure msdos_get_dir(dir)
  52.  
  53.     # Returns a sorted list of all filenames (full paths included) in
  54.     # directory "dir."  The list is sorted.  Fails on invalid or empty
  55.     # directory.  Aborts if temp file cannot be opened.
  56.     #
  57.     # Temp files can be directed to one or another directory either by
  58.     # manually setting the variable temp_dir below, or by setting the
  59.     # value of the environment variable TEMPDIR to an appropriate
  60.     # directory name.
  61.  
  62.     local in_dir, filename_list, line
  63.     static temp_dir
  64.     initial {
  65.         temp_dir := 
  66.             (trim(map(getenv("TEMPDIR"), "/", "\\"), '\\') || "\\") |
  67.                 ".\\"
  68.     }
  69.  
  70.     # Get name of tempfile to be used.
  71.     temp_name := get_dos_tempname(temp_dir) |
  72.     stop("No more available tempfile names!")
  73.  
  74.     # Make sure we have an unambiguous directory name, with backslashes
  75.     # instead of UNIX-like forward slashes.
  76.     dir := trim(map(dir, "/", "\\"), '\\') || "\\"
  77.  
  78.     # Put dir listing into a temp file.
  79.     system("dir "||dir||" > "||temp_name)
  80.  
  81.     # Put tempfile entries into a list, removing blank- and
  82.     # space-initial lines.  Exclude directories (i.e. return file
  83.     # names only).
  84.     in_dir := open(temp_name,"r") |
  85.     stop("Can't open temp file in directory ",temp_dir,".")
  86.     filename_list := list()
  87.     every filename := ("" ~== !in_dir) do {
  88.         match(" ",filename) | find(" <DIR>", filename) & next
  89.     # Exclude our own tempfiles (may not always be appropriate).
  90.     filename ?:= trim(trim(tab(10)) || "." || tab(13), '. ')
  91.     put(filename_list, map(dir || filename))
  92.     }
  93.  
  94.     # Clean up.
  95.     close(in_dir) & remove(temp_name)
  96.  
  97.     # Check to be sure we actually managed to read some files.
  98.     if *filename_list = 0 then fail
  99.     else return sort(filename_list)
  100.  
  101. end
  102.  
  103.  
  104.  
  105. procedure get_dos_tempname(dir)
  106.  
  107.     # Don't clobber existing files.  Get a unique temp file name for
  108.     # use as a temporary storage site.
  109.  
  110.     every temp_name := dir || "icondir." || right(string(1 to 999),3,"0") do {
  111.     temp_file := open(temp_name,"r") | break
  112.         close(temp_file)
  113.     }
  114.     return \temp_name
  115.  
  116. end
  117.  
  118.  
  119.  
  120. procedure unix_get_dir(dir)
  121.  
  122.     dir := trim(dir, '/') || "/"
  123.     filename_list := list()
  124.     in_dir := open("/bin/ls -F "||dir, "pr")
  125.     every filename := ("" ~== !in_dir) do {
  126.     match("/",filename,*filename) & next
  127.     put(filename_list, trim(dir || filename, '*'))
  128.     }
  129.     close(in_dir)
  130.  
  131.     if *filename_list = 0 then fail
  132.     else return filename_list
  133.  
  134. end
  135.